home *** CD-ROM | disk | FTP | other *** search
/ Amiga Format CD 46 / Amiga Format CD46 (1999-10-20)(Future Publishing)(GB)[!][issue 1999-12].iso / -serious- / hardware / -printer- / psutils / getafm.rexx < prev    next >
OS/2 REXX Batch file  |  1999-09-06  |  6KB  |  362 lines

  1. /*#!/bin/sh*/
  2.  
  3. if ~arg() then do
  4.   parse source . . $0 .
  5.   echo "usage: "$0" font-name | gsnd - >font-name.afm"
  6.   exit 1
  7. end
  8.  
  9. do i=13 to sourceline()
  10.     say sourceline(i)
  11. end
  12. exit
  13. %!
  14. % produce .afm for $1
  15. % (c) 1993 by Robert Joop <rj@rainbow.in-berlin.de>
  16. % inspired by two other versions of this theme which are
  17. %    getafm 1.00 (c) AJCD
  18. % and getafm.ps by an unknown author,
  19. %    modified by J. Daniel Smith <dsmith@mailhost.aa.cad.slb.com>
  20.  
  21. % Metrics dictionary code added by AJCD, 7/6/93
  22.  
  23. /getafmdict 100 dict dup begin
  24.  
  25.   /buf 256 string def
  26.   /buf2 16 string def
  27.  
  28.   /prany    % dict dictname printname -> dict
  29.   {
  30.     2 index 2 index cvn known
  31.     {
  32.       print % printname
  33.       ( ) print
  34.       1 index exch cvn get =
  35.     }
  36.     {
  37.       (Comment /FontInfo contains no /) print
  38.       2 copy eq
  39.       {
  40.         = % printname
  41.     pop % dictname
  42.       }
  43.       {
  44.     exch
  45.     print % dictname
  46.     (, therefore no ) print
  47.     = % printname
  48.       }
  49.       ifelse
  50.     }
  51.     ifelse
  52.   }
  53.   bind def
  54.  
  55.   /printfontname
  56.   {
  57.     (FontName)dup prany
  58.   }
  59.   bind def
  60.  
  61.   /printfontinfo
  62.   {
  63.     dup /FontInfo known
  64.     {
  65.       dup /FontInfo get
  66.     (FullName)dup prany
  67.     (FamilyName)dup prany
  68.     (Weight)dup prany
  69.     (ItalicAngle)dup prany
  70.     (isFixedPitch)(IsFixedPitch) prany
  71.     (UnderlinePosition)dup prany
  72.     (UnderlineThickness)dup prany
  73.     (Version)(version) prany
  74.     (Notice)dup prany
  75.       pop
  76.     }
  77.     {
  78.       (Comment Font lacks a /FontInfo!)=
  79.     }
  80.     ifelse
  81.   }
  82.   bind def
  83.  
  84.   /prbbox % llx lly urx ury -> -
  85.   {
  86.     4 1 roll 3 1 roll exch % swap top 4 elements
  87.     4 { ( ) print buf cvs print } repeat
  88.   }
  89.   bind def
  90.  
  91.   /getbbox % fontdict chardict character -> fontdict chardict llx lly urx ury
  92.   {
  93.     gsave
  94.       2 index setfont 0 0 moveto
  95.       false charpath flattenpath pathbbox
  96.     grestore
  97.   }
  98.   bind def
  99.  
  100.   /printmiscinfo
  101.   {
  102.     dup /FontBBox known
  103.     {
  104.       (FontBBox) print
  105.       dup /FontBBox get aload pop prbbox ()=
  106.     }
  107.     {
  108.       (Comment missing required /FontBBox)=
  109.       quit
  110.     }
  111.     ifelse
  112.     2 copy exch get
  113.       dup /H known
  114.       1 index /x known and
  115.       1 index /d known and
  116.       1 index /p known and
  117.       dup /looksRoman exch def
  118.       {
  119.     (CapHeight ) print
  120.     (H) getbbox
  121.     ceiling cvi = pop pop pop
  122.     (XHeight ) print
  123.     (x) getbbox
  124.     ceiling cvi = pop pop pop
  125.     (Ascender ) print
  126.     (d) getbbox
  127.     ceiling cvi = pop pop pop
  128.     (Descender ) print
  129.     (p) getbbox
  130.     pop pop floor cvi = pop
  131.       }
  132.       {
  133.     (Comment font doesn't contain H, x, d and p; therefore no CapHeight, XHeight, Ascender and Descender)=
  134.       }
  135.       ifelse
  136.     pop
  137.     dup /Encoding get
  138.       [
  139.     [ (ISOLatin1Encoding) /ISOLatin1Encoding ]
  140.     [ (AdobeStandardEncoding) /StandardEncoding ]
  141.       ]
  142.       {
  143.     aload pop dup where
  144.     {
  145.       exch get 2 index eq
  146.       {
  147.         (EncodingScheme ) print
  148.         buf cvs =
  149.       }
  150.       {
  151.         pop
  152.       }
  153.       ifelse
  154.     }
  155.     {
  156.       pop pop
  157.     }
  158.     ifelse
  159.       }
  160.       forall
  161.     pop
  162.   }
  163.   bind def
  164.  
  165.   /printcharmetric
  166.   {
  167.     % chardictname fontdict charnamedict encoding charindex charname
  168.  
  169.     4 index dup length dict dup begin exch
  170.       {
  171.     1 index /FID ne
  172.     2 index /UniqueID ne
  173.     and
  174.     {
  175.       1 index /Encoding eq { 256 array copy } if
  176.       def
  177.     }
  178.     { pop pop }
  179.     ifelse
  180.       }
  181.       forall
  182.     end
  183.     dup /Encoding get 32 3 index put
  184.     /f2 exch definefont
  185.     setfont
  186.  
  187.     (C ) print
  188.     1 index buf cvs print
  189.  
  190.     ( ; WX ) print
  191. % Metrics entries are:
  192. %       1 number:               which is the character width
  193. %       an array of 2 numbers:  which are the left sidebearing and width
  194. %       an array of 4 numbers:  x & y left sidebearing, width and height
  195.     dup 5 index         % /charname fontdict
  196.     dup /Metrics known {
  197.        /Metrics get exch 2 copy known {
  198.           get dup type /arraytype eq {
  199.              dup length 2 eq
  200.              {1 get} {2 get} ifelse
  201.           } if
  202.           round cvi buf cvs print
  203.        } {
  204.           pop pop ( ) stringwidth pop round cvi buf cvs print
  205.        } ifelse
  206.     } {
  207.        pop pop ( ) stringwidth pop round cvi buf cvs print
  208.     } ifelse
  209.  
  210.     ( ; N ) print
  211.     dup buf cvs print
  212.  
  213.     ( ; B) print
  214.     gsave
  215.       newpath 0 0 moveto
  216.       ( ) true charpath flattenpath pathbbox
  217.     grestore
  218.     2 { ceiling cvi 4 1 roll } repeat
  219.     2 { floor cvi 4 1 roll } repeat
  220.     prbbox
  221.  
  222.     looksRoman
  223.     {
  224.       [
  225.     [ /f [ /i /f /l ] ]
  226.     [ /ff [ /i /l ] ]
  227.       ]
  228.       {
  229.     aload pop 1 index 3 index eq
  230.     {
  231.       { 
  232.         1 index buf cvs
  233.         length
  234.         1 index buf2 cvs dup length
  235.         2 index add
  236.         buf
  237.         4 2 roll putinterval
  238.         buf 0
  239.         3 -1 roll getinterval
  240.         dup cvn
  241.         7 index
  242.         exch known
  243.         {
  244.           exch
  245.           ( ; L ) print
  246.           buf2 cvs print
  247.           ( ) print
  248.           print
  249.         }
  250.         {
  251.           pop pop
  252.         }
  253.         ifelse
  254.       }
  255.       forall
  256.       pop 
  257.     }
  258.     {
  259.       pop pop
  260.     }
  261.     ifelse
  262.       }
  263.       forall
  264.     }
  265.     if
  266.     pop
  267.  
  268.     ( ;)=
  269.   }
  270.   bind def
  271.  
  272.   /printcharmetrics
  273.   {
  274.     (StartCharMetrics ) print
  275.     2 copy exch get length 1 sub buf cvs =
  276.  
  277.     256 dict dup begin
  278.       1 index /Encoding get
  279.       { null def }
  280.       forall
  281.     end
  282.     % chardictname fontdict charnamedict
  283.     1 index /Encoding get
  284.     0 1 255
  285.     {
  286.       % encoding index
  287.       2 copy get
  288.       dup /.notdef eq { pop } { printcharmetric } ifelse
  289.       pop % index
  290.     } for
  291.  
  292.     -1
  293.     3 index 5 index get
  294.     {
  295.       pop
  296.       dup /.notdef eq
  297.       { pop }
  298.       {
  299.     % chardictname fontdict charnamedict encoding charindex charname
  300.     dup 4 index exch known
  301.     { pop }
  302.     { printcharmetric }
  303.     ifelse
  304.       }
  305.       ifelse
  306.     }
  307.     forall
  308.     % charnamedict encoding index
  309.     pop pop pop
  310.  
  311.     (EndCharMetrics)=
  312.   }
  313.   bind def
  314.  
  315.   /printfontmetrics
  316.   {
  317.     (StartFontMetrics 3.0)=
  318.     (Comment Produced by getafm 3.0 (which is by rj@rainbow.in-berlin.de))=
  319.  
  320.     printfontname
  321.     printfontinfo
  322.     printmiscinfo
  323.     printcharmetrics
  324.  
  325.     (EndFontMetrics)=
  326.   }
  327.   bind def
  328.  
  329. end def
  330.  
  331. /getafm
  332. {
  333.   getafmdict begin
  334.     save exch
  335.       findfont 1000 scalefont 
  336.  
  337.       null
  338.       [ /CharDefs /CharData /CharProcs /CharStrings ]
  339.       {
  340.     2 index 1 index known { exch } if
  341.     pop
  342.       }
  343.       forall
  344.       dup null eq
  345.       {
  346.     (can't find dictionary with character data!)=
  347.     quit
  348.       }
  349.       if
  350.       exch % dictname fontdict
  351.  
  352.       printfontmetrics
  353.  
  354.       pop pop
  355.     restore
  356.   end
  357. }
  358. bind def
  359.  
  360. /$1 getafm
  361.  
  362.